package Sort;
/*
* 选择排序
* 它的工作原理：首先在未排序序列中找到最小（大）元素，
* 存放到排序序列的起始位置，然后，再从剩余未排序元素中继续寻找最小（大）元素，
* 然后放到已排序序列的末尾。以此类推，直到所有元素均排序完毕。
*
* 2.1 算法描述
n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下：
（1）初始状态：无序区为R[1..n]，有序区为空；

（2）第i趟排序(i=1,2,3…n-1)开始时，当前有序区和无序区分别为R[1..i-1]和R(i..n）。该趟排序从当前无序区中-选出关键字最小的记录 R[k]，将它与无序区的第1个记录R交换，使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区；

（3）n-1趟结束，数组有序化了。
选择排序的最好、最坏、平均时间复杂度都是O(n^2)
* 选择排序不是一种稳定的排序算法。
* 因为选择排序每次都要从未排序区间中选择最小值，并和前面的元素交换位置，这样会破坏稳定性。
 * */
public class SelectSort {

    static void ss(int[] nums){
        for (int i = 0; i < nums.length; i++) {
//            int  loc = getMax(nums,i);
            int  loc = getMin(nums,i);
            swap(nums,i,loc);
        }
    }

    //找到最大值的坐标
    static int getMax(int[] nums,int index){
        int max = Integer.MIN_VALUE;
        int loc = index;
        for (int i = index; i < nums.length; i++) {
            if(nums[i]>max) {
                max = nums[i];
                loc = i;
            }

        }
        return loc;
    }

    //找到最小值的坐标
    static int getMin(int[] nums,int index){
        int min = Integer.MAX_VALUE;
        int loc = index;
        for (int i = index; i < nums.length; i++) {
            if(nums[i]< min) {
                min = nums[i];
                loc = i;
            }

        }
        return loc;
    }

 //交换值
    static void swap(int[] nums, int i, int j){
        int swap = nums[i];
        nums[i]=nums[j];
        nums[j]=swap;
    }

    public static void main(String[] args) {
        int[] nums = new int[]{3,3,3,7,9,122344,4656,34,34,4656,5,6,7,8,9,343,57765,23,12321,9,3};
        ss(nums);
        for (int i:nums
        ) {
            System.out.println(i);
        }
    }

}
